/*******************************************
  简单的ZigBee树
  author 周翔
  2012-8-16
  使用的是基于items的QTreeWidget

  还需对ZigBee节点进行封装

  在对树中的项改变时，还需使用一个队列进行保存，还有对信息的筛选

  还需一个逻辑层，定型检测全部节点状态，来及时更新树
  设备的信息更新是怎么实现的
  *******************************************/
#ifndef ZIGBEENODETREEWIDGET_H
#define ZIGBEENODETREEWIDGET_H

#include <QWidget>
#include <QDebug>
#include "ZigBeeTreeNode.h"


const QString ALLNODE = "ALLNODE";//全部节点

typedef QPair<QString,int> StringIntPair;

class QHBoxLayout;
class QTreeWidgetItem;

namespace Ui {
class ZigBeeNodeTreeWidget;
}

class ZigBeeNodeTreeWidget : public QWidget
{
    Q_OBJECT
    
public:
    explicit ZigBeeNodeTreeWidget(QWidget *parent = 0);
    ~ZigBeeNodeTreeWidget();
    void addNode(const ZigBeeTreeNode &node);//向其中添加节点，需要一些节点信息
    void deleteNode(const ZigBeeTreeNode &node);//从树中删除不在网络中的节点
    void moveNode(const ZigBeeTreeNode &node);//节点状态改变时，移动节点到相关的父节点下
    QList<StringIntPair>& getCheckSelectNodes()  {return checkStatusNodes;}
    void clearCheckStatus() {checkStatusNodes.clear();}
    void clear();
signals:
    /**
     * @brief sig_activeNode 点击根节点和两个子树节点发出
     * @param value ALLNODE
     */
    void sig_activeNode(const QString& value);//发送到上层指定其他窗口显示的形式
    /**
     * @brief sig_activeNode  点击叶节点发出
     * @param name
     */
    void sig_activeNode(ushort name);
public slots:
    /**
     * @brief slt_nodeChange 对外接口，
     * @param name 设备名
     * @param states 状态
     */
    void slt_nodeChange(ushort name, bool states);//对树进行更新
protected slots:
    void showMessage(QTreeWidgetItem* item,int c);
    void treeItemChange(QTreeWidgetItem *item,int c);
    void creatCheckStatusNodes(QTreeWidgetItem *item,int c);
private:
    Ui::ZigBeeNodeTreeWidget *ui;
  //  QHBoxLayout *mainLayout;
    QTreeWidgetItem *activeNode;//活动节点
    QTreeWidgetItem *unactiveNode;//不活动节点
    QTreeWidgetItem *allNode;//根节点

    QList<ZigBeeTreeNode> list_Node;//保存节点的链表
    QList<QTreeWidgetItem*> activeNodeList;//保存活动节点的项
    QList<QTreeWidgetItem*> unactiveNodeList;//保存非活动节点的项
    QList<StringIntPair> checkStatusNodes;//用来记录节点选中的情况

    void initUI();
    void initTree();
    void insertNode(ushort devname,QTreeWidgetItem *parent);
    bool removeNode(ushort devname,QList<QTreeWidgetItem*> &list);
    void beActive(const ZigBeeTreeNode &adress);
    void beUnActive(const ZigBeeTreeNode& adress);
    bool hadHave(ushort adress);
    bool isExist(ushort node);
    void addNodeInlist(const ZigBeeTreeNode &node);
    void setUncheck(QTreeWidgetItem *item, int c);
 //   ZigBeeTreeNode &getNode(const QString& adress);
};

#endif // ZIGBEENODETREEWIDGET_H
